{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# GraviPy - tutorial"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## _Coordinates_ and _MetricTensor_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To start working with the gravipy package you must load the package and initialize a pretty-printing mode in Jupyter environment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "from gravipy.tensorial import * # import GraviPy package\n",
    "from sympy import init_printing\n",
    "import inspect\n",
    "init_printing()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The next step is to choose coordinates and define a metric tensor of a particular space. Let's take, for example, the Schwarzschild metric - vacuum solution to the Einstein's field equations which describes the gravitational field of a spherical mass distribution."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "# define some symbolic variables\n",
    "t, r, theta, phi, M = symbols('t, r, \\\\theta, \\phi, M')\n",
    "# create a coordinate four-vector object instantiating \n",
    "# the Coordinates class\n",
    "x = Coordinates('\\chi', [t, r, theta, phi])\n",
    "# define a matrix of a metric tensor components\n",
    "Metric = diag(-(1-2*M/r), 1/(1-2*M/r), r**2, r**2*sin(theta)**2)  \n",
    "# create a metric tensor object instantiating the MetricTensor class\n",
    "g = MetricTensor('g', x, Metric)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Each component of any tensor object, can be computed by calling the appropriate instance of the _GeneralTensor_ subclass with indices as arguments. The covariant indices take positive integer values (1, 2, ..., dim). The contravariant indices take negative values (-dim, ..., -2, -1)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAhElEQVQYGV2QgRGAIAwDWydwBmbBDXQFl9QZ2ABXwUSNUrnL0fZpA1hrzXqZWYUSa38wA6B+NwxI+jUhKSr8YQbYBR0BCwuUnpjwgOrriST40bcfG/xwOMDgR3iNxTYyhLKewV2QXci/D2GDPIOfu/NySZBjeX0DYMzvKxrLN27QSmn8CWOLY8q7tsXYAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$\\displaystyle t$"
      ],
      "text/plain": [
       "t"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x(-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEYAAAAqCAYAAAAOGC2lAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADa0lEQVRoBe2agVEbMRBF7YwLcCjBdAChA+jASQeQDmBSQuggSQUJ7iCkggQ6gBKCO3D+E7uHrEhmfMyYO1s7s6y0Wsnaf6s96cRgsVgMYNFY/MX4pyR84O2pVNuZ+EpMZ3ia2qR12Zyb7YMk4z/bJx1jU/UYlKv4RzXpz+bEcaxPy7IBTIA5T9viutoPxA7kyjHjfq9VfqPJQoBwGkr2RxO6UHEuxpksDYfDiRpuxPfio6zRk/KdFzX2tZe7Kh2YD5ogDqaEA2MDIG2jfizGBmAAKUvqz7L7IXb7rF2XlA5McEwOkGdyVNIf6unTtwiMgUr7nphxyC2dpwCMnMPBoZilExN5AcKxVXSnxhJ4JFiiimiBOr+MmKRHDOUl0pPGEZbHZQawgUWCL78AnHQOZBhL9akKX0NlMDhBaqxbq3daFIHRrHnbzOQISThHcb5wZwEykEAJERSBGtu7WWdlFhg5BSjXcur9ipl7fiEKfKk1wKjfmfQz+ms89L3JL8z5P2DkBJswnP2IXIPIT/vYawyWUACFuqhX+YUJLwFjDu3HoPC0YYydrO75xdVEDbZExl4URbSTX+bS+ZJD12lqgJFDJM6jGBSbOU8/pVy++CMjNnEsIU+43g972ntDI2ZqEcAOd6Yyu2AoPHlJzkuXQfP05yLjvL+yl17HBniv8ktwUw4iWRZ+GEzlHTZmB3gcALEBiOZ8pDJREdeJNDZzsT39xz5elyWbOs21UopAk2PShl2qa7lPxQ9ilnygkGO8skvSQPgmn8PbVLIBBRzqUgKEx9M/m9q3Si1zgKlLCRQyVIHJgIKqAlOBKSBQUI+UeF59I6OENyzML6jtDfJrlU2m7VTjtj6bjZ6bVOYHN66yN8XhJn+45pgC2hWYCkwBgUf10q4X1U7vfJXU2e1yrcOXAcAhWfPd6GangREARao5pgBNBaYCU0CgoK4RUwCm1YcqZXOyeLhVkOTfR7gdaK5ntVNNP56ruV/UNmJOzHlecZxh+MANGNwffRL3ntaOGEULkfHbPJ9I3goUv3Xk6uWvtfVarL2P4aQrIOZIec7VCNGzdJfUa0Rs8msvJUCxvuQZ7pu2DhT8WhsYOhmRT1p/7/BBuipfAgz/t7eV0cLDagWM8stEfckx3xlkG6kVMAICYO6VX7Z2Kf0Dy6japQjC9vgAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$\\displaystyle \\frac{2 M}{r} - 1$"
      ],
      "text/plain": [
       "2⋅M    \n",
       "─── - 1\n",
       " r     "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g(1, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle t \\left(\\frac{2 M}{r} - 1\\right)$"
      ],
      "text/plain": [
       "  ⎛2⋅M    ⎞\n",
       "t⋅⎜─── - 1⎟\n",
       "  ⎝ r     ⎠"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x(1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Matrix representation of a tensor can be obtained in the following way"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHAAAAAZCAYAAADpG6rZAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADcUlEQVRoBe2ajW3bMBCF7aADBB4h2SBoN0g2SLpB3Q2aEQp3g2SD1tmg2aCoN3A2aNMN3PeppHCiJZNwTMZCeQAl8Sjxft7xjowznUwmS7ULNU9Xm83myXfq/Xg8MJ1OL6XNndHoYarOWoCdG2Z9HIEHBOaZ1FycjEDX4irKOadqc7Xr4sKNQAeS4Ww/VgADn8hppCnKyjeG1LcpC1ZJ+hgTlgSgjFinRENM2LGPy0b2AoB3o7LyR+1Bz6zE02PVPQqglCeNnP0nGxvAuwW8ADBW5WvQr5jQKICa4EptFZto7OMK1LlsmAm8+x5bZj28rCzpQ9A8xoSkAJg0UUzQCMZvpWNT97yucqI/Xv32vIJ3jnPRhfOmTyGH/o3Gzly7EI9izpHjS983L+U5mTjsndoHtbdq3oGTXHIlg40KQYqtpFBL8KEwpf7jHvgqPbB3psY5nJ0wOsFbyf7Bszmg4KCtpg+pfxraHjs0T3IWzCn6rvZT7dr0nw8tz84nWQCHcO62PcO37+Z6lhwWiLeZTdPcy9Iz/mAf0mJEX23ZuwI14KlI/XOR98MJRTEijh0gtFDLncJ8lJN1WpJegBpNY+0Hez5IDkG7NDa/V9/WP57xQ0c/9ScnXHYQKcROtOPVFw09obwMIfIAsD17if+oltuJyOzY6YIKoz5zyUWSw+aJ1WU3T+fq25SJXwiyLRoE0DiT6MhKUtbXmKbmqN9xZk7hzk5E+AzgxXGI9mdBz8txZ1XF7GU/0BvEgwDqAz4i57aTG2MZykFFUvaA4j6I/DArI+vqc4LwMzWuIfmYbLB2XTZY9Fl9Xz3P3ncB2HGmJmJDw2Q5Kcz9OWU1c7vV3wFPtn7SIGk9y447MKrZcRpeWLYoJ/fSxe8JzKu7ayB5t8nDMohn8nTvMu7MuGfHRRpyeiNtz2lTP+P819QYpwfpkwAuQZw/keeprX/ShfJFINlx/15zH/w5yRkC+myrSaW2yDYfH/IieUTeneQU/2lLsgkcdnmkLuT3/TlN7Dwk+QQPIJFKqYkAhx74o3fROHwWgwDq40qFPeBAuUxZLB7AXTWwsPpVnDwQ1r+oUyqAURcVfaGtf6lSK4CpnirzXnt8SBVXAUz1VIH3UmpfqEYFMPTIyPoVwJEBFqrbHCMCZv2/0MAhx9LV0aE5Kxt9Vn8BxZT5IsBbKeAAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}t & r & \\theta & \\phi\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "[t  r  \\theta  \\phi]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x(-All)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\frac{2 M}{r} - 1 & 0 & 0 & 0\\\\0 & \\frac{1}{- \\frac{2 M}{r} + 1} & 0 & 0\\\\0 & 0 & r^{2} & 0\\\\0 & 0 & 0 & r^{2} \\sin^{2}{\\left(\\theta \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡2⋅M                                    ⎤\n",
       "⎢─── - 1      0      0          0       ⎥\n",
       "⎢ r                                     ⎥\n",
       "⎢                                       ⎥\n",
       "⎢             1                         ⎥\n",
       "⎢   0     ─────────  0          0       ⎥\n",
       "⎢           2⋅M                         ⎥\n",
       "⎢         - ─── + 1                     ⎥\n",
       "⎢            r                          ⎥\n",
       "⎢                                       ⎥\n",
       "⎢                     2                 ⎥\n",
       "⎢   0         0      r          0       ⎥\n",
       "⎢                                       ⎥\n",
       "⎢                         2    2        ⎥\n",
       "⎣   0         0      0   r ⋅sin (\\theta)⎦"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g(All, All)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}0 & 0 & 0 & r^{2} \\sin^{2}{\\left(\\theta \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡          2    2        ⎤\n",
       "⎣0  0  0  r ⋅sin (\\theta)⎦"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g(All, 4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Predefined _Tensor_ Classes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The GraviPy package contains a number of the _Tensor_ subclasses that can be used to calculate a tensor components. The _Tensor_ subclasses available in the current version of GraviPy package are"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Christoffel', 'Ricci', 'Riemann', 'Einstein', 'Geodesic']\n"
     ]
    }
   ],
   "source": [
    "print([cls.__name__ for cls in vars()['Tensor'].__subclasses__()])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### The _Christoffel_ symbols"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The first one is the _Christoffel_ class that represents Christoffel symbols of the first and second kind. (Note that the Christoffel symbols are not tensors) Components of the _Christoffel_ objects are computed from the below formula "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$ \\Gamma_{\\rho \\mu \\nu} = g_{\\rho \\sigma}\\Gamma^{\\sigma}_{\\ \\mu \\nu} = \\frac{1}{2}(g_{\\rho \\mu, \\nu} + g_{\\rho \\nu, \\mu} - g_{\\mu \\nu, \\rho})$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's create an instance of the _Christoffel_ class for the Schwarzschild metric g and compute some components of the object"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAqCAYAAAAu9HJYAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACy0lEQVRYCe2Y7VEcMQyGdzMUwFDCXgf56AA6YNLBkQ5IDdBB0kFydEDoIEcHUALQwfE+RvLIx+4wl9jc/TjNaNaWtNa7sizb261Wq64Fd113Jl6IV8anb/mR3bnZPup5LU7vNAEYwcjRD3N8HuXrbdl8FPtHHUf9BymaUd/3gwZfiu/FX95w9Nn1AvjH2zybgtT4x2IcAhLAo6SPITV+i92+sGsN8pOiAsBJkBZt9EfiQzG5WFBrkO7sTg0AjBGLg2gTRaiYagTNQIZ8xA+R6iRjcWRS/1SdnyY44SnAt9bPj2Yg5SHmlzse3LMApsgK1JPJor2bpWdLkJ6PRCdFUh4zSLXPJL8ChUV9NB/RtwTJ+JGI2AyBTXMCaAaT+Yi+CUiLDPUxUlrhNs1HIbrYkI9PknlaxPdSolbfdeSBujfIaR5bfXYetrtXO4/Jr6N9bDeJpJx+lxPPQ3UTeRkqSowiy4qfzMf0ZkT8v20NyN5LtDhUACpHTW3yLvYpPxTuaM/7h+s4egS7Tq2mu+p370HWCuc+kvtI1opArXF6DUS1v9lwwLnqa7HPaudoVnD3xXzD2Zk0P5jUvINCKXIhN6TbIOZAwsGEc2dJ65v5e/WFAoD5OKc2h4vlmP983htTtpQJEKekCJIjG4svy9z/tnccptnJpznKkm5rOakopfuOI9TTr7t/gyw1tx3JiIccHV04O1EnfZUrut8iam9vPZICyKWNK8MoQIBWz0k55S5DfvGrby7ml57nG9XkUv1EZjtzgNZ/UL/YcquXIHm/kBNAcMni7v3yt9YuXehMD/Ckx8aYd15dxKqClAMcOyjq4CKAShEOfb8l8kWZXR+ftUGmKMgpWx2Oi9/K0fEm7aoLR469IBM1AlD8CED2L1QVZADAv50y+YNy02YrkF8FpEoU+aDqIFVGBo1LTv7CQQ2qDlKgAHmvfKw23c9vGiUkj7EEkwAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$\\displaystyle - \\frac{M}{r^{2}}$"
      ],
      "text/plain": [
       "-M \n",
       "───\n",
       "  2\n",
       " r "
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Ga = Christoffel('Ga', g)\n",
    "Ga(1, 2, 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Each component of the _Tensor_ object is computed only once due to memoization procedure implemented in the _Tensor_ class. Computed value of a tensor component is stored in _components_ dictionary (attribute of a _Tensor_ instance) and returned by the next call to the instance."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left\\{ \\left( 1, \\  1, \\  2\\right) : - \\frac{M}{r^{2}}, \\  \\left( 1, \\  2, \\  1\\right) : - \\frac{M}{r^{2}}\\right\\}$"
      ],
      "text/plain": [
       "⎧           -M              -M ⎫\n",
       "⎪(1, 1, 2): ───, (1, 2, 1): ───⎪\n",
       "⎨             2               2⎬\n",
       "⎪            r               r ⎪\n",
       "⎩                              ⎭"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Ga.components"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The above dictionary consists of two elements because the symmetry of the Christoffel symbols is implemented in the _Christoffel_ class. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If necessary, you can clear the _components_ dictionary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABIAAAAVCAYAAABLy77vAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABAklEQVQ4Ed1U0RGCMAztOYHnCLgBMzCCMzgCOzgCMzACMzCCjqBugO95TS9JwcJ5/ti7XNK88AjpK2GapuAthHCGdfSCIa5jroXfS168IWEBbIRdpMB7YA3sAas15onYCfC8S51DDbsddW6HhF5HbG46sRA/kWf3aXmiBGwN/ovooD/ff1oFkIMsrSsKzLDT8QM4wTJ96CPWMWqpt05yiN+KHeD5lkqANR71fXyu1R3NKnaJEATsqBc8ETFBADYIuORRk90AP2yqmgMvLd4AcyieqESg8bvefEOkecJPiYxizWs/bHxHuWLnH6aqzbDN8UcJrP1DNloeGVEk43XZ9M9+ASbLchSvWRlhAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$\\displaystyle \\left\\{ \\right\\}$"
      ],
      "text/plain": [
       "{}"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Ga.components = {}\n",
    "Ga.components"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The _Matrix_ representation of the Christoffel symbols is the following"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\left[\\begin{matrix}0 & - \\frac{M}{r^{2}} & 0 & 0\\\\- \\frac{M}{r^{2}} & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\end{matrix}\\right] & \\left[\\begin{matrix}\\frac{M}{r^{2}} & 0 & 0 & 0\\\\0 & - \\frac{M}{\\left(2 M - r\\right)^{2}} & 0 & 0\\\\0 & 0 & - r & 0\\\\0 & 0 & 0 & - r \\sin^{2}{\\left(\\theta \\right)}\\end{matrix}\\right] & \\left[\\begin{matrix}0 & 0 & 0 & 0\\\\0 & 0 & r & 0\\\\0 & r & 0 & 0\\\\0 & 0 & 0 & - \\frac{r^{2} \\sin{\\left(2 \\theta \\right)}}{2}\\end{matrix}\\right] & \\left[\\begin{matrix}0 & 0 & 0 & 0\\\\0 & 0 & 0 & r \\sin^{2}{\\left(\\theta \\right)}\\\\0 & 0 & 0 & \\frac{r^{2} \\sin{\\left(2 \\theta \\right)}}{2}\\\\0 & r \\sin^{2}{\\left(\\theta \\right)} & \\frac{r^{2} \\sin{\\left(2 \\theta \\right)}}{2} & 0\\end{matrix}\\right]\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡                  ⎡M                                  ⎤                      \n",
       "⎢⎡     -M       ⎤  ⎢──      0       0          0       ⎥                      \n",
       "⎢⎢ 0   ───  0  0⎥  ⎢ 2                                 ⎥  ⎡0  0  0          0 \n",
       "⎢⎢       2      ⎥  ⎢r                                  ⎥  ⎢                   \n",
       "⎢⎢      r       ⎥  ⎢                                   ⎥  ⎢0  0  r          0 \n",
       "⎢⎢              ⎥  ⎢       -M                          ⎥  ⎢                   \n",
       "⎢⎢-M            ⎥  ⎢0   ──────────  0          0       ⎥  ⎢0  r  0          0 \n",
       "⎢⎢───   0   0  0⎥  ⎢             2                     ⎥  ⎢                   \n",
       "⎢⎢  2           ⎥  ⎢    (2⋅M - r)                      ⎥  ⎢           2       \n",
       "⎢⎢ r            ⎥  ⎢                                   ⎥  ⎢         -r ⋅sin(2⋅\n",
       "⎢⎢              ⎥  ⎢0       0       -r         0       ⎥  ⎢0  0  0  ──────────\n",
       "⎢⎢ 0    0   0  0⎥  ⎢                                   ⎥  ⎣                 2 \n",
       "⎢⎢              ⎥  ⎢                          2        ⎥                      \n",
       "⎣⎣ 0    0   0  0⎦  ⎣0       0       0   -r⋅sin (\\theta)⎦                      \n",
       "\n",
       "           ⎡0        0                0                 0        ⎤⎤\n",
       "           ⎢                                                     ⎥⎥\n",
       "        ⎤  ⎢                                           2         ⎥⎥\n",
       "        ⎥  ⎢0        0                0           r⋅sin (\\theta) ⎥⎥\n",
       "        ⎥  ⎢                                                     ⎥⎥\n",
       "        ⎥  ⎢                                      2              ⎥⎥\n",
       "        ⎥  ⎢                                     r ⋅sin(2⋅\\theta)⎥⎥\n",
       "        ⎥  ⎢0        0                0          ────────────────⎥⎥\n",
       "        ⎥  ⎢                                            2        ⎥⎥\n",
       "\\theta) ⎥  ⎢                                                     ⎥⎥\n",
       "────────⎥  ⎢                    2                                ⎥⎥\n",
       "        ⎦  ⎢        2          r ⋅sin(2⋅\\theta)                  ⎥⎥\n",
       "           ⎢0  r⋅sin (\\theta)  ────────────────         0        ⎥⎥\n",
       "           ⎣                          2                          ⎦⎦"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Ga(All, All, All)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can get help on any of classes mentioned before by running the command"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on class Christoffel in module gravipy.tensorial:\n",
      "\n",
      "class Christoffel(Tensor)\n",
      " |  Christoffel(symbol, metric, *args, **kwargs)\n",
      " |  \n",
      " |  Christoffel.\n",
      " |  \n",
      " |  Represents a class of Christoffel symbols of the first and second kind.\n",
      " |  \n",
      " |  Parameters\n",
      " |  ==========\n",
      " |  \n",
      " |  symbol : python string - name of the Christoffel symbol\n",
      " |  metric : GraviPy MtricTensor object\n",
      " |  \n",
      " |  Examples\n",
      " |  ========\n",
      " |  \n",
      " |  Define a Christoffel symbols for the Schwarzschild metric:\n",
      " |  \n",
      " |  >>> from gravipy import *\n",
      " |  >>> t, r, theta, phi = symbols('t, r, \\\\theta, \\phi')\n",
      " |  >>> chi = Coordinates('\\chi', [t, r, theta, phi])\n",
      " |  >>> M = Symbol('M')\n",
      " |  >>> Metric = diag(-(1 - 2 * M / r), 1 / (1 - 2 * M / r), r ** 2,\n",
      " |  ...                  r ** 2 * sin(theta) ** 2)\n",
      " |  >>> g = MetricTensor('g', chi, Metric)\n",
      " |  >>> Ga = Christoffel('Ga', g)\n",
      " |  >>> Ga(-1, 2, 1)\n",
      " |  -M/(r*(2*M - r))\n",
      " |  >>> Ga(2, All, All)\n",
      " |  Matrix([\n",
      " |  [M/r**2,               0,  0,                 0],\n",
      " |  [     0, -M/(2*M - r)**2,  0,                 0],\n",
      " |  [     0,               0, -r,                 0],\n",
      " |  [     0,               0,  0, -r*sin(\\theta)**2]])\n",
      " |  >>> Ga(1, -1, 2) # doctest: +IGNORE_EXCEPTION_DETAIL\n",
      " |  Traceback (most recent call last):\n",
      " |  GraviPyError: \"Tensor component Ga(1, -1, 2) doesn't  exist\"\n",
      " |  \n",
      " |  Method resolution order:\n",
      " |      Christoffel\n",
      " |      Tensor\n",
      " |      GeneralTensor\n",
      " |      builtins.object\n",
      " |  \n",
      " |  Methods defined here:\n",
      " |  \n",
      " |  __init__(self, symbol, metric, *args, **kwargs)\n",
      " |      Initialize self.  See help(type(self)) for accurate signature.\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data and other attributes inherited from Tensor:\n",
      " |  \n",
      " |  TensorObjects = [<gravipy.tensorial.Christoffel object>]\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Methods inherited from GeneralTensor:\n",
      " |  \n",
      " |  __call__(self, *idxs)\n",
      " |      Call self as a function.\n",
      " |  \n",
      " |  covariantD(self, *idxs)\n",
      " |  \n",
      " |  partialD(self, *idxs)\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Static methods inherited from GeneralTensor:\n",
      " |  \n",
      " |  get_nmatrixel(M, idxs)\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data descriptors inherited from GeneralTensor:\n",
      " |  \n",
      " |  __dict__\n",
      " |      dictionary for instance variables (if defined)\n",
      " |  \n",
      " |  __weakref__\n",
      " |      list of weak references to the object (if defined)\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data and other attributes inherited from GeneralTensor:\n",
      " |  \n",
      " |  GeneralTensorObjects = [<gravipy.tensorial.Coordinates object>, <gravi...\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(Christoffel)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Try also \"_Christoffel?_\" and  \"_Christoffel??_\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### The _Ricci_ tensor"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$ R_{\\mu \\nu} = \\frac{\\partial \\Gamma^{\\sigma}_{\\ \\mu \\nu}}{\\partial x^{\\sigma}} - \\frac{\\partial \\Gamma^{\\sigma}_{\\ \\mu \\sigma}}{\\partial x^{\\nu}} + \\Gamma^{\\sigma}_{\\ \\mu \\nu}\\Gamma^{\\rho}_{\\ \\sigma \\rho} - \\Gamma^{\\rho}_{\\ \\mu \\sigma}\\Gamma^{\\sigma}_{\\ \\nu \\rho} $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡0  0  0  0⎤\n",
       "⎢          ⎥\n",
       "⎢0  0  0  0⎥\n",
       "⎢          ⎥\n",
       "⎢0  0  0  0⎥\n",
       "⎢          ⎥\n",
       "⎣0  0  0  0⎦"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Ri = Ricci('Ri', g)\n",
    "Ri(All, All)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Contraction of the _Ricci_ tensor $R = R_{\\mu}^{\\ \\mu} = g^{\\mu \\nu}R_{\\mu \\nu}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAzklEQVQoFW1SiRGCMBAkGQtgtAPswKcCKYEa7MESLMWhBGkBOtAOEDuA3XDL3Cg3c9lkby+bEMI4jpkihHDHvEd+kXvkA/UOmGUUmrjFsnLrHOsXskh1E11BDBIJwdGh9cIniFoCIbgKybPlEQOjnOFv5FkZZcQFeBbGZ4bVseCOWyup2yuXZlmzqJ29UPMdhUuXWIdy6yNuKEuRTre4vGXdoLpmreZGwhrCk9/K5nzGLrm6j8vn+n3CAdyBmo11Eo7IG75rYdwZeIEo/RQTNRRqzYwqZmYAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$\\displaystyle 0$"
      ],
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Ri.scalar()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### The _Riemann_ tensor"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$ R_{\\mu \\nu \\rho \\sigma} = \\frac{\\partial \\Gamma_{\\mu \\nu \\sigma}}{\\partial x^{\\rho}} - \\frac{\\partial \\Gamma_{\\mu \\nu \\rho}}{\\partial x^{\\sigma}} + \\Gamma^{\\alpha}_{\\ \\nu \\sigma}\\Gamma_{\\mu \\rho \\alpha} - \\Gamma^{\\alpha}_{\\ \\nu \\rho}\\Gamma_{\\mu \\sigma \\alpha} - \\frac{\\partial g_{\\mu \\alpha}}{\\partial x^{\\rho}}\\Gamma^{\\alpha}_{\\ \\nu \\sigma} + \\frac{\\partial g_{\\mu \\alpha}}{\\partial x^{\\sigma}}\\Gamma^{\\alpha}_{\\ \\nu \\rho} $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "Rm = Riemann('Rm', g)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Some nonzero components of the _Riemann_ tensor are"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle R_{1212} = - \\frac{2 M}{r^{3}}$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle R_{1313} = \\frac{M \\left(- 2 M + r\\right)}{r^{2}}$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle R_{1414} = \\frac{M \\left(- 2 M + r\\right) \\sin^{2}{\\left(\\theta \\right)}}{r^{2}}$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle R_{2323} = \\frac{M}{2 M - r}$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle R_{2424} = \\frac{M \\sin^{2}{\\left(\\theta \\right)}}{2 M - r}$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle R_{3434} = 2 M r \\sin^{2}{\\left(\\theta \\right)}$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from IPython.display import display, Math\n",
    "from sympy import latex\n",
    "for i, j, k, l in list(variations(range(1, 5), 4, True)):\n",
    "    if Rm(i, j, k, l) != 0 and k<l and i<j:\n",
    "        display(Math('R_{'+str(i)+str(j)+str(k)+str(l)+'} = '+ latex(Rm(i, j, k, l))))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can also display the matrix representation of the tensor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "# Rm(All, All, All, All)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Contraction of the _Riemann_ tensor $R_{\\mu \\nu} = R^{\\rho}_{\\ \\mu \\rho \\nu} $"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡0  0  0  0⎤\n",
       "⎢          ⎥\n",
       "⎢0  0  0  0⎥\n",
       "⎢          ⎥\n",
       "⎢0  0  0  0⎥\n",
       "⎢          ⎥\n",
       "⎣0  0  0  0⎦"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ricci = sum([Rm(i, All, k, All)*g(-i, -k)\n",
    "             for i, k in list(variations(range(1, 5), 2, True))],\n",
    "            zeros(4))\n",
    "ricci.simplify()\n",
    "ricci"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### The _Einstein_ tensor"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$ G_{\\mu \\nu} = R_{\\mu \\nu} - \\frac{1}{2}g_{\\mu \\nu}R $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡0  0  0  0⎤\n",
       "⎢          ⎥\n",
       "⎢0  0  0  0⎥\n",
       "⎢          ⎥\n",
       "⎢0  0  0  0⎥\n",
       "⎢          ⎥\n",
       "⎣0  0  0  0⎦"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "G = Einstein('G', Ri)\n",
    "G(All, All)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### _Geodesics_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$ w_{\\mu} = \\frac{Du_{\\mu}}{d\\tau} = \\frac{d^2x_{\\mu}}{d\\tau^2} - \\frac{1}{2}g_{\\rho \\sigma, \\mu} \\frac{dx^{\\rho}}{d\\tau}\\frac{dx^{\\sigma}}{d\\tau} $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}- \\frac{2 M \\frac{d}{d \\tau} r{\\left(\\tau \\right)} \\frac{d}{d \\tau} t{\\left(\\tau \\right)}}{r^{2}{\\left(\\tau \\right)}} + \\left(\\frac{2 M}{r{\\left(\\tau \\right)}} - 1\\right) \\frac{d^{2}}{d \\tau^{2}} t{\\left(\\tau \\right)}\\\\\\frac{M \\left(\\frac{d}{d \\tau} t{\\left(\\tau \\right)}\\right)^{2}}{r^{2}{\\left(\\tau \\right)}} - \\frac{M \\left(\\frac{d}{d \\tau} r{\\left(\\tau \\right)}\\right)^{2}}{\\left(- \\frac{2 M}{r{\\left(\\tau \\right)}} + 1\\right)^{2} r^{2}{\\left(\\tau \\right)}} - r{\\left(\\tau \\right)} \\sin^{2}{\\left(\\theta{\\left(\\tau \\right)} \\right)} \\left(\\frac{d}{d \\tau} \\phi{\\left(\\tau \\right)}\\right)^{2} - r{\\left(\\tau \\right)} \\left(\\frac{d}{d \\tau} \\theta{\\left(\\tau \\right)}\\right)^{2} + \\frac{\\frac{d^{2}}{d \\tau^{2}} r{\\left(\\tau \\right)}}{- \\frac{2 M}{r{\\left(\\tau \\right)}} + 1}\\\\- r^{2}{\\left(\\tau \\right)} \\sin{\\left(\\theta{\\left(\\tau \\right)} \\right)} \\cos{\\left(\\theta{\\left(\\tau \\right)} \\right)} \\left(\\frac{d}{d \\tau} \\phi{\\left(\\tau \\right)}\\right)^{2} + r^{2}{\\left(\\tau \\right)} \\frac{d^{2}}{d \\tau^{2}} \\theta{\\left(\\tau \\right)} + 2 r{\\left(\\tau \\right)} \\frac{d}{d \\tau} \\theta{\\left(\\tau \\right)} \\frac{d}{d \\tau} r{\\left(\\tau \\right)}\\\\r^{2}{\\left(\\tau \\right)} \\sin^{2}{\\left(\\theta{\\left(\\tau \\right)} \\right)} \\frac{d^{2}}{d \\tau^{2}} \\phi{\\left(\\tau \\right)} + 2 r^{2}{\\left(\\tau \\right)} \\sin{\\left(\\theta{\\left(\\tau \\right)} \\right)} \\cos{\\left(\\theta{\\left(\\tau \\right)} \\right)} \\frac{d}{d \\tau} \\phi{\\left(\\tau \\right)} \\frac{d}{d \\tau} \\theta{\\left(\\tau \\right)} + 2 r{\\left(\\tau \\right)} \\sin^{2}{\\left(\\theta{\\left(\\tau \\right)} \\right)} \\frac{d}{d \\tau} \\phi{\\left(\\tau \\right)} \\frac{d}{d \\tau} r{\\left(\\tau \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡                                                                         d   \n",
       "⎢                                                                   2⋅M⋅─────(\n",
       "⎢                                                                       d\\tau \n",
       "⎢                                                                 - ──────────\n",
       "⎢                                                                             \n",
       "⎢                                                                             \n",
       "⎢                                                                             \n",
       "⎢                                                                             \n",
       "⎢                                          2                        2         \n",
       "⎢                          ⎛  d           ⎞         ⎛  d           ⎞          \n",
       "⎢                        M⋅⎜─────(t(\\tau))⎟       M⋅⎜─────(r(\\tau))⎟          \n",
       "⎢                          ⎝d\\tau         ⎠         ⎝d\\tau         ⎠          \n",
       "⎢                        ─────────────────── - ───────────────────────── - r(\\\n",
       "⎢                               2                             2               \n",
       "⎢                              r (\\tau)        ⎛    2⋅M      ⎞   2            \n",
       "⎢                                              ⎜- ─────── + 1⎟ ⋅r (\\tau)      \n",
       "⎢                                              ⎝  r(\\tau)    ⎠                \n",
       "⎢                                                                             \n",
       "⎢                                                                             \n",
       "⎢                            2                                           ⎛  d \n",
       "⎢                         - r (\\tau)⋅sin(\\theta(\\tau))⋅cos(\\theta(\\tau))⋅⎜────\n",
       "⎢                                                                        ⎝d\\ta\n",
       "⎢                                                                             \n",
       "⎢                                                                             \n",
       "⎢                               2                                             \n",
       "⎢ 2          2                 d                     2                        \n",
       "⎢r (\\tau)⋅sin (\\theta(\\tau))⋅──────(\\phi(\\tau)) + 2⋅r (\\tau)⋅sin(\\theta(\\tau))\n",
       "⎢                                 2                                           \n",
       "⎣                            d\\tau                                            \n",
       "\n",
       "           d                                                                  \n",
       "r(\\tau))⋅─────(t(\\tau))                    2                                  \n",
       "         d\\tau            ⎛  2⋅M      ⎞   d                                   \n",
       "─────────────────────── + ⎜─────── - 1⎟⋅──────(t(\\tau))                       \n",
       "    2                     ⎝r(\\tau)    ⎠      2                                \n",
       "   r (\\tau)                             d\\tau                                 \n",
       "                                                                              \n",
       "                                                                              \n",
       "                                                                              \n",
       "                                                                              \n",
       "                                           2                                2 \n",
       "        2               ⎛  d              ⎞            ⎛  d                ⎞  \n",
       "tau)⋅sin (\\theta(\\tau))⋅⎜─────(\\phi(\\tau))⎟  - r(\\tau)⋅⎜─────(\\theta(\\tau))⎟  \n",
       "                        ⎝d\\tau            ⎠            ⎝d\\tau              ⎠  \n",
       "                                                                              \n",
       "                                                                              \n",
       "                                                                              \n",
       "                                                                              \n",
       "              2               2                                               \n",
       "             ⎞     2         d                                d               \n",
       "─(\\phi(\\tau))⎟  + r (\\tau)⋅──────(\\theta(\\tau)) + 2⋅r(\\tau)⋅─────(\\theta(\\tau)\n",
       "u            ⎠                  2                           d\\tau             \n",
       "                           d\\tau                                              \n",
       "                                                                              \n",
       "                                                                              \n",
       "                     d                 d                                2     \n",
       "⋅cos(\\theta(\\tau))⋅─────(\\phi(\\tau))⋅─────(\\theta(\\tau)) + 2⋅r(\\tau)⋅sin (\\the\n",
       "                   d\\tau             d\\tau                                    \n",
       "                                                                              \n",
       "\n",
       "                                          ⎤\n",
       "                                          ⎥\n",
       "                                          ⎥\n",
       "                                          ⎥\n",
       "                                          ⎥\n",
       "                                          ⎥\n",
       "                                          ⎥\n",
       "     2                                    ⎥\n",
       "    d                                     ⎥\n",
       "  ──────(r(\\tau))                         ⎥\n",
       "       2                                  ⎥\n",
       "  d\\tau                                   ⎥\n",
       "+ ───────────────                         ⎥\n",
       "       2⋅M                                ⎥\n",
       "   - ─────── + 1                          ⎥\n",
       "     r(\\tau)                              ⎥\n",
       "                                          ⎥\n",
       "                                          ⎥\n",
       "                                          ⎥\n",
       "    d                                     ⎥\n",
       ")⋅─────(r(\\tau))                          ⎥\n",
       "  d\\tau                                   ⎥\n",
       "                                          ⎥\n",
       "                                          ⎥\n",
       "                                          ⎥\n",
       "            d                 d           ⎥\n",
       "ta(\\tau))⋅─────(\\phi(\\tau))⋅─────(r(\\tau))⎥\n",
       "          d\\tau             d\\tau         ⎥\n",
       "                                          ⎦"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tau = Symbol('\\\\tau')\n",
    "w = Geodesic('w', g, tau)\n",
    "w(All).transpose()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Please note that instantiation of a _Geodesic_ class for the metric $g$ automatically turns on a _Parametrization_ mode for the metric $g$. Then all coordinates are functions of a world line parameter $\\tau$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAADwAAAAUCAYAAADRA14pAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACBklEQVRYCe2YgU0CQRBFF2MBxBKgAxIrkBIQOpAOMFZgsAPswGgH0oFCB9iB0Q7O9y97l/XYg71dCESZZJjd2bnZ+Tdzs8cZY8wEXljuZVlmxHX6Yv3YJPHeWAwrZL+Ir6pnbqaugWPo1Rfrxyq34TkT4v9EJ8B/PdunDG/KcKvV6sFTeAHP6mxZm8DtuvWmeuvvC5nVsE6aIDoPsnKM6M63bNpBtUKumD84ywbdgPkS/berjx3jT6eF6AqWT83v7RhhdIx+5IOAn0aAcbwsNiCQOeMxXAJG12d+gd2L7FIJfz18vLn+0LWLOGL8pzzDKumODUqZVXB6cXmMCcR3jYBVwGqPpMqJBuwEMgasSnyErsy2D8AOdCN8vKb4aVTSno1UukPpAavy3jepP1ynbBKdYbvpE1Ld+DkliJBrbRV1uLF5Hwm5xmeTClilLKq96wTahnWc6A9KCim7wd24bqNowADQvxM1qLKsfZuQETUZBSrgqoZY6nJh7dkf6jTqGbZg5wLDWEEMkOrQ3nJD32VdGYomfOykRzTOsA38nQDy8kLqPFYW77agucRWdgelRoABqxcLdeRqJlXaynL+TCN1XpbEXKX8WSoOOAguaQtGXXLtxQJd8bo5w043Q93bpSE2+z6j3f02jvXirc8i6qLVTzxregLPPwEdmyT24lNV9RPPL/0P/b1N0uYpTtkAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$\\displaystyle \\left[ \\left[ \\chi, \\  \\tau\\right]\\right]$"
      ],
      "text/plain": [
       "[[\\chi, \\tau]]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Parametrization.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}t{\\left(\\tau \\right)} & r{\\left(\\tau \\right)} & \\theta{\\left(\\tau \\right)} & \\phi{\\left(\\tau \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "[t(\\tau)  r(\\tau)  \\theta(\\tau)  \\phi(\\tau)]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x(-All)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\frac{2 M}{r{\\left(\\tau \\right)}} - 1 & 0 & 0 & 0\\\\0 & \\frac{1}{- \\frac{2 M}{r{\\left(\\tau \\right)}} + 1} & 0 & 0\\\\0 & 0 & r^{2}{\\left(\\tau \\right)} & 0\\\\0 & 0 & 0 & r^{2}{\\left(\\tau \\right)} \\sin^{2}{\\left(\\theta{\\left(\\tau \\right)} \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡  2⋅M                                                            ⎤\n",
       "⎢─────── - 1        0           0                   0             ⎥\n",
       "⎢r(\\tau)                                                          ⎥\n",
       "⎢                                                                 ⎥\n",
       "⎢                   1                                             ⎥\n",
       "⎢     0       ─────────────     0                   0             ⎥\n",
       "⎢                 2⋅M                                             ⎥\n",
       "⎢             - ─────── + 1                                       ⎥\n",
       "⎢               r(\\tau)                                           ⎥\n",
       "⎢                                                                 ⎥\n",
       "⎢                             2                                   ⎥\n",
       "⎢     0             0        r (\\tau)               0             ⎥\n",
       "⎢                                                                 ⎥\n",
       "⎢                                       2          2              ⎥\n",
       "⎣     0             0           0      r (\\tau)⋅sin (\\theta(\\tau))⎦"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g(All, All)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "_Parametrization_ mode can be deactivated by typing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "No parametrization activated\n"
     ]
    }
   ],
   "source": [
    "Parametrization.deactivate(x)\n",
    "Parametrization.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHAAAAAZCAYAAADpG6rZAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADcUlEQVRoBe2ajW3bMBCF7aADBB4h2SBoN0g2SLpB3Q2aEQp3g2SD1tmg2aCoN3A2aNMN3PeppHCiJZNwTMZCeQAl8Sjxft7xjowznUwmS7ULNU9Xm83myXfq/Xg8MJ1OL6XNndHoYarOWoCdG2Z9HIEHBOaZ1FycjEDX4irKOadqc7Xr4sKNQAeS4Ww/VgADn8hppCnKyjeG1LcpC1ZJ+hgTlgSgjFinRENM2LGPy0b2AoB3o7LyR+1Bz6zE02PVPQqglCeNnP0nGxvAuwW8ADBW5WvQr5jQKICa4EptFZto7OMK1LlsmAm8+x5bZj28rCzpQ9A8xoSkAJg0UUzQCMZvpWNT97yucqI/Xv32vIJ3jnPRhfOmTyGH/o3Gzly7EI9izpHjS983L+U5mTjsndoHtbdq3oGTXHIlg40KQYqtpFBL8KEwpf7jHvgqPbB3psY5nJ0wOsFbyf7Bszmg4KCtpg+pfxraHjs0T3IWzCn6rvZT7dr0nw8tz84nWQCHcO62PcO37+Z6lhwWiLeZTdPcy9Iz/mAf0mJEX23ZuwI14KlI/XOR98MJRTEijh0gtFDLncJ8lJN1WpJegBpNY+0Hez5IDkG7NDa/V9/WP57xQ0c/9ScnXHYQKcROtOPVFw09obwMIfIAsD17if+oltuJyOzY6YIKoz5zyUWSw+aJ1WU3T+fq25SJXwiyLRoE0DiT6MhKUtbXmKbmqN9xZk7hzk5E+AzgxXGI9mdBz8txZ1XF7GU/0BvEgwDqAz4i57aTG2MZykFFUvaA4j6I/DArI+vqc4LwMzWuIfmYbLB2XTZY9Fl9Xz3P3ncB2HGmJmJDw2Q5Kcz9OWU1c7vV3wFPtn7SIGk9y447MKrZcRpeWLYoJ/fSxe8JzKu7ayB5t8nDMohn8nTvMu7MuGfHRRpyeiNtz2lTP+P819QYpwfpkwAuQZw/keeprX/ShfJFINlx/15zH/w5yRkC+myrSaW2yDYfH/IieUTeneQU/2lLsgkcdnmkLuT3/TlN7Dwk+QQPIJFKqYkAhx74o3fROHwWgwDq40qFPeBAuUxZLB7AXTWwsPpVnDwQ1r+oUyqAURcVfaGtf6lSK4CpnirzXnt8SBVXAUz1VIH3UmpfqEYFMPTIyPoVwJEBFqrbHCMCZv2/0MAhx9LV0aE5Kxt9Vn8BxZT5IsBbKeAAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}t & r & \\theta & \\phi\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "[t  r  \\theta  \\phi]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x(-All)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\frac{2 M}{r} - 1 & 0 & 0 & 0\\\\0 & \\frac{1}{- \\frac{2 M}{r} + 1} & 0 & 0\\\\0 & 0 & r^{2} & 0\\\\0 & 0 & 0 & r^{2} \\sin^{2}{\\left(\\theta \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡2⋅M                                    ⎤\n",
       "⎢─── - 1      0      0          0       ⎥\n",
       "⎢ r                                     ⎥\n",
       "⎢                                       ⎥\n",
       "⎢             1                         ⎥\n",
       "⎢   0     ─────────  0          0       ⎥\n",
       "⎢           2⋅M                         ⎥\n",
       "⎢         - ─── + 1                     ⎥\n",
       "⎢            r                          ⎥\n",
       "⎢                                       ⎥\n",
       "⎢                     2                 ⎥\n",
       "⎢   0         0      r          0       ⎥\n",
       "⎢                                       ⎥\n",
       "⎢                         2    2        ⎥\n",
       "⎣   0         0      0   r ⋅sin (\\theta)⎦"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g(All, All)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Derivatives"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Partial derivative"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "All instances of a _GeneralTensor_ subclasses inherits _partialD_ method which works exactly the same way as SymPy _diff_ method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\operatorname{T(1, 2)}{\\left(t,r,\\theta,\\phi \\right)}$"
      ],
      "text/plain": [
       "T(1, 2)(t, r, \\theta, \\phi)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "T = Tensor('T', 2, g)\n",
    "T(1, 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\frac{\\partial^{2}}{\\partial t\\partial \\theta} \\operatorname{T(1, 2)}{\\left(t,r,\\theta,\\phi \\right)}$"
      ],
      "text/plain": [
       "     2                                 \n",
       "    ∂                                  \n",
       "──────────(T(1, 2)(t, r, \\theta, \\phi))\n",
       "∂t ∂\\theta                             "
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "T.partialD(1, 2, 1, 3) # The first two indices belongs to second rank tensor T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\frac{\\partial^{2}}{\\partial t\\partial \\theta} \\operatorname{T(1, 2)}{\\left(t,r,\\theta,\\phi \\right)}$"
      ],
      "text/plain": [
       "     2                                 \n",
       "    ∂                                  \n",
       "──────────(T(1, 2)(t, r, \\theta, \\phi))\n",
       "∂t ∂\\theta                             "
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "T(1, 2).diff(x(-1), x(-3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The only difference is that computed value of _partialD_ is saved in  \"_partial_derivative_components_\" dictionary an then returned by the next call to the _partialD_ method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left\\{ \\left( 1, \\  2, \\  1, \\  3\\right) : \\frac{\\partial^{2}}{\\partial t\\partial \\theta} \\operatorname{T(1, 2)}{\\left(t,r,\\theta,\\phi \\right)}\\right\\}$"
      ],
      "text/plain": [
       "⎧                   2                                 ⎫\n",
       "⎪                  ∂                                  ⎪\n",
       "⎨(1, 2, 1, 3): ──────────(T(1, 2)(t, r, \\theta, \\phi))⎬\n",
       "⎪              ∂t ∂\\theta                             ⎪\n",
       "⎩                                                     ⎭"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "T.partial_derivative_components"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Covariant derivative"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Covariant derivative components of the tensor ___T___  can be computed by the covariantD method from the formula"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$ \\nabla_{\\sigma} T_{\\mu}^{\\ \\nu} = T_{\\mu \\ ;\\sigma}^{\\ \\nu} = \\frac{\\partial T_{\\mu}^{\\ \\nu}}{\\partial x^{\\sigma}} - \\Gamma^{\\rho}_{\\ \\mu \\sigma}T_{\\rho}^{\\ \\nu} + \\Gamma^{\\nu}_{\\ \\rho \\sigma}T_{\\mu}^{\\ \\rho}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's compute some covariant derivatives of a scalar field C"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGAAAAAUCAYAAAByKzjvAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEtklEQVRYCdWZj1EUMRSHOcYCGDpQOwDpADtAO0A70LECBjuADhQ7gA4UOoAOVDrA78slSzaX3cudC+ibye0mee+Xl/cvubvZ3d3dxpQ0m81egLcP7umUuA+Bha5b4L6l/ULfb1OuoR3AvMkxGTugf9Ubp7NRNphU7APtnHZGO4nPd/JCGvl4QO68HP8X++i/T3N/7lXDnEypJ3gL9hEf0p46J9i9ZnwN/5sWjJ0Yo3BQdGT+MgfPZaP89dh8yf9QfXTYiXvYSmvQ1zpdP42v+wRryAE6/DLhbtIJZDrSjIj3tOcwLJQQxlKaCnIRBOMHsu94/QFPL+0ST0y/hbRM84/8NAo/outtsa5ZMRX9rAHFNS+wh4GO21Mq4BW6Rv5oFDCvkr+TXHoyNhrdzFvGOs8nucd+ooOBUtPfDFjI+nX0A0cb7QzJMmcABx1CBuANjWNaHiJURgXDPfpF72s+grxngs6sRn/kVale1sTxx358ZMFSf/cuubcp6DW2uBoCija+wW77z6LxjIobJlKJGZJ1XCMfFwyeDQvGdQHG39B0kG2HMZ19zVqfeTZRxNFIe7RD2itaMpqOb8KKOOphCcpJPaVlwTfnqnyCrT7bNO1jOQ/75b1/62EgkvbSNsGYpt8HNtKVpFXekfXsGExf5nQQkGvjhwMtrmOpPBAr9hfKydA68Gt4BX3mzdL7N/oZVEkny0tnC96rFxN5nHvGh8aRFiJ4Ptz0qbfH0vc184MpObZCjKzvkcd1jKiUqWbi2LoltFGqfIi8NMkaOmVd/cJVPdPJ7xW5LX1Xz96a9NVbZ4WDVwVGD18WCNlR44sYfvmqZhDzHtDVa9mQTBpP6/mkqefgOklm6Bnle3owplPEDRE8JFsbR8Yotpx2+6Zf4qeS2/HID4V1N3kJEcTg0vpHpJgtRmEzIaPhlDFSVqZMr1Cn6efR1YwX9ZA/ZVOS9dp9C27KqjTe8jSql+njeTWYXTogAKBgi2H3ULQG1qVTRWsV0PudopkxKuyDQ2uXsQKxDDSj+Kjgae26N2t8oGhDsz3vG+lf4lD+2KZzowPSjcboHiTA5RtS1JNfwBr1DAeO67Q4u8Qqa2s5P9onADR8z/jo4pchb39Nt6jKAuHGk42bpV2g8W75OQW/ll3a4HaTSUFMpWMUMhp6pMFoAh3FTfTmY8es2K1NMGYJco0NcHz323DIIvu0O1oXRfKVxLzKKluLpMDeiOX934hUFzEtPwZIjxqxlPE7hRiJXkZ7im/J1bn5fOLzqb0uZjCEQRflxSgPngmD8/PhDJ7cq3Hq/oGsnvfHrJf3o/M35sTTgV77LEW9nziYTym7y9ytPCWN4ee8y7CYT3t0TXWt/RwRIJdhpXXh06Ea2SAykDW82NqjVq6ZCgEg/2HvZEZg7T5gbqr7lW8VLOQsS023sGW4T4Xl3mnd/X9MT/dKC7enTV6mIrPHlFyHPNyr0b8G2FNhlfV/TPVPTFoVNiZzAAa0tLwgJY2EZopl4WezwAjjE2N19X9ExXQO+l1mfvCPpcqqcyxsaq30hwz8TWnbostTYrWurX1oXanuDmEGJ6GYAf/FX5KTbHgFEGzjLfOCYAq3QkX/ALZh288AQBRvAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$\\displaystyle C{\\left(t,r,\\theta,\\phi \\right)}$"
      ],
      "text/plain": [
       "C(t, r, \\theta, \\phi)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C = Tensor('C', 0, g)\n",
    "C()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\frac{\\partial}{\\partial t} C{\\left(t,r,\\theta,\\phi \\right)}$"
      ],
      "text/plain": [
       "∂                        \n",
       "──(C(t, r, \\theta, \\phi))\n",
       "∂t                       "
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C.covariantD(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\frac{r \\frac{\\partial^{2}}{\\partial r\\partial \\theta} C{\\left(t,r,\\theta,\\phi \\right)} - \\frac{\\partial}{\\partial \\theta} C{\\left(t,r,\\theta,\\phi \\right)}}{r}$"
      ],
      "text/plain": [
       "       2                                                            \n",
       "      ∂                                  ∂                          \n",
       "r⋅──────────(C(t, r, \\theta, \\phi)) - ───────(C(t, r, \\theta, \\phi))\n",
       "  ∂r ∂\\theta                          ∂\\theta                       \n",
       "────────────────────────────────────────────────────────────────────\n",
       "                                 r                                  "
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C.covariantD(2, 3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "All _covariantD_ components of every _Tensor_ object are also memoized"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle (1,): \\frac{\\partial}{\\partial t} C{\\left(t,r,\\theta,\\phi \\right)}$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle (2,): \\frac{\\partial}{\\partial r} C{\\left(t,r,\\theta,\\phi \\right)}$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle (3,): \\frac{\\partial}{\\partial \\theta} C{\\left(t,r,\\theta,\\phi \\right)}$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle (4,): \\frac{\\partial}{\\partial \\phi} C{\\left(t,r,\\theta,\\phi \\right)}$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle (2, 3): \\frac{r \\frac{\\partial^{2}}{\\partial r\\partial \\theta} C{\\left(t,r,\\theta,\\phi \\right)} - \\frac{\\partial}{\\partial \\theta} C{\\left(t,r,\\theta,\\phi \\right)}}{r}$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for k in C.covariant_derivative_components:\n",
    "    display(Math(str(k) + ': '\n",
    "                 + latex(C.covariant_derivative_components[k])))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\frac{M \\frac{\\partial^{2}}{\\partial t\\partial \\theta} C{\\left(t,r,\\theta,\\phi \\right)} + r \\left(2 M - r\\right) \\frac{\\partial^{3}}{\\partial t\\partial r\\partial \\theta} C{\\left(t,r,\\theta,\\phi \\right)} - \\left(2 M - r\\right) \\frac{\\partial^{2}}{\\partial t\\partial \\theta} C{\\left(t,r,\\theta,\\phi \\right)}}{r \\left(2 M - r\\right)}$"
      ],
      "text/plain": [
       "       2                                                 3                    \n",
       "      ∂                                                 ∂                     \n",
       "M⋅──────────(C(t, r, \\theta, \\phi)) + r⋅(2⋅M - r)⋅─────────────(C(t, r, \\theta\n",
       "  ∂t ∂\\theta                                      ∂t ∂r ∂\\theta               \n",
       "──────────────────────────────────────────────────────────────────────────────\n",
       "                                                            r⋅(2⋅M - r)       \n",
       "\n",
       "                          2                           \n",
       "                         ∂                            \n",
       ", \\phi)) - (2⋅M - r)⋅──────────(C(t, r, \\theta, \\phi))\n",
       "                     ∂t ∂\\theta                       \n",
       "──────────────────────────────────────────────────────\n",
       "                                                      "
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C.covariantD(1, 2, 3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Proof that the covariant derivative of the metric tensor $g$ is zero"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "not any([g.covariantD(i, j, k).simplify()\n",
    "         for i, j, k in list(variations(range(1, 5), 3, True))])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Bianchi identity in the Schwarzschild spacetime"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$ R_{\\mu \\nu \\sigma \\rho ;\\gamma} + R_{\\mu \\nu \\gamma \\sigma ;\\rho} + R_{\\mu \\nu \\rho \\gamma ;\\sigma} = 0$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "not any([(Rm.covariantD(i, j, k, l, m) + Rm.covariantD(i, j, m, k, l)\n",
    "          + Rm.covariantD(i, j, l, m, k)).simplify()\n",
    "         for i, j, k, l, m in list(variations(range(1, 5), 5, True))])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## User-defined tensors"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To define a new scalar/vector/tensor field in some space you should __extend__ the _Tensor_ class or __create an instance__ of the _Tensor_ class."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### _Tensor_ class instantiation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's create a third-rank tensor field living in the Schwarzshild spacetime as an instance of the _Tensor_ class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "S = Tensor('S', 3, g)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Until you define (override) the _\\_compute\\_covariant\\_component_ method of the __S__ object, all of $4^3$ components are arbitrary functions of coordinates "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKAAAAAUCAYAAAAKlDZOAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAG0klEQVRoBd2aj3EdNRCHYw8FmJQQOjCkg6SDkA5IOghDBYzTgUMFJHQQOgDSgU0FJO7AfJ+QbiSddE937+wAmlH0b/en3dVqb/Wck9vb2wfHlJOTk0fwPwHnzTE4/yZedHqGPB/Q6XqLXP8lmyDrGTo+p35E31+26Nvi0Qa1/Zp2hUh+hbis6rO4dmnbqpHvfWttr7lKtveMredb8eH1wlxkVbyga47J3DuqRmzq3puHR1veqU16e6+dR84nyhpl9tJ1z3oD9kWLhz0KuzIOBruiLQ6VscI5/0cLyDnXqN1DYk2lPlHPehhL8/JR3+U0jHUeNzfqrnUOna8wMmNlFO9FjsfYvbu657R5Xx7qkk20aXc9x7rLPjKcU4uzYawdNp1VLSs4PQcs7ApdONDiUBIYay+ozUOIazM+5oPT0OooevtmpeA1Ks8MwpyG+5TkHG3heUVVniLixbmrGod5dXhVz/fG0GqvmU0SPWvB2dP4c7bI4kWoL93MNltlBLtrN9Ymu9IPN3bJaM3PCXwHbzI0HsgxDqijtRwjOfaqSAKWUV3MInoyVsbZRWPOyzTs6NAu2oR1L9Rsn62HvJUPGTyXmV7MaYfCKbfsAYZ2Lr6oOQ5rk11PGXykPo/JKN1Z8bCLYoLpBKCbkvQCbHkg/qMF2VRkuCDvr9QvbRNTTIwd6hxFge6GiWtoNOhiGbSJONPei4B3u/g98G/zLZDfT7JFfzi2PMV2H3oguV2/gMhwaCL6J0L4kjXiTUai33rd+imZaOjfSWHvrzvAyVhHXQD01YHV/3VHT7dXz29j67hXmjZhD51Ofi+t9Zw5nd3I/pp2qEQc9X5M/Y76DTXZwWAwhBVxlKMOLOmSeelWF3CV5SHVMzljHHSl3/s14R+7Ijg006fSQaom08WnStpIr8MeDNUZ7iyPS1hrW2WiKmMzyR3Bg1fj6Hh+Mpt5ZsJhvZsHJxpbyqJNWD8q/4M/6Bv38WzSrxTuO/uc5rLlfWhT+mKbV1MTSNc97KSnaMMkj5d68g36zUeZNGEtbcggMNKG20mbHHECy2g9uCKRT2t5C81ROWCOlfpgunfxMk5rW1qwfJjM8sKExZqOM8tD03pqpZE2jeuWNe26Kf+Dz+iSDrjQn3kvZDffasgh/0wO5jzv2XzNX4/hKS4eY898ys3pe9Fn58VcsGuIaDWoY4pKN29FnG9GxxwLul0dEDwPsftgyvde04/6qOssUjOnHYBbjgwRo2sT1j34TVEbviCXLdXD6e4zIKf8hRyMg4603QvUwoXe8y0uJ+MaOwS0mh+6sOcp32pBZgUGk0hzlwcxb5jR3OcEMhip9ISXW/c1L7E2+H9nzsNNeVCDZPsUe4rtvkaL1QWdbyJTkI/xpvw7yiHUb5UQ2vQG3LV/CRnJjc1Vuw+SUxaDk1UChWGmaP0ycqxR76VgOMP1V8gzOZ+OZF0pgFHoKjuIEfaHEI08dpZs4iF4eSbHWSlDkvMpne5hJqKBNjl0IjUI/ZgGK1r1MscLJZ6HNs7HRrqf41TeBLvqgB5k8+YzL7OGq5X2QAS48xJleJw7X9xUp1xbNLw/xdQHkBx5cpAM2LWaPlueuks2KRwHnZQ97TkBDHT8m21LxgHWcI7qUeiCLH5ZrrHJ0Cu62ii8eLM5/SiXz8/vG7BbkTXY9TQyXyBI4YSMz1j7iTpFnUhro0P2fiLJyPpRUnzqLXW6QTmjfdYU0peafWW0XlKde4liITIxPoglBsXfvwJeGPEPvMkZxCsOJ9KoZ27UxFq3SzbRlpOs9E3Sw6UelR06bSFOK5qox6gN/P0vBJaI6fl6QYoyiKc9c//wK5X0NN3QsfP1fI/JruGFwooO6ItFr/WQBGgmu85Ti+STjYyUobKWMMIjhrFO5lzxomYcPom0s+RfLIp8dlq12B+aRaxMNmVXllS7emYyHHxlgte1CWs6j/v4qStsEPc4KDt8XfxMtxEcnVjdjXy2TduvkEtnFkfd1DHhLtoMOs/2fHKapMRoC7PKTs/tUb6aDgwjUNcINf3SeE8s91EuauHoB/bfbJO9ZN8LJ+k5igedl2x2uRJO3kI32fWUwdZitDQEH1vM726OBYn8e2IJ+QPV2z1ajrHJXrLvhZN0HsUzQo+kKuJOdt3sgDiNf6Lb8hJVgFDMM+j8FYdHNXtiKUjEMwUZTs632mQv2ffCSQexEm/K/xJ/q53ZFaMd8xnWgZr/W2YEF96hkH3fWO6nXtTVKQY8q20Czy522Asn2XsN3igtdIVdT6Kxmd9W8Gi//UaK1n9a2Ab6mbnQyYTan2vCi26tOP9Hm6y1QYu+Zde/AeOcfcr18FFcAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$\\displaystyle \\operatorname{S(1, 2, 3)}{\\left(t,r,\\theta,\\phi \\right)}$"
      ],
      "text/plain": [
       "S(1, 2, 3)(t, r, \\theta, \\phi)"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "S(1, 2, 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(['    def _compute_covariant_component(self, idxs):\\n',\n",
       "  '        if len(idxs) == 0:\\n',\n",
       "  '            component = Function(str(self.symbol))(*self.coords.c)\\n',\n",
       "  '        elif len(idxs) == 1:\\n',\n",
       "  '            component = Function(str(self.symbol) +\\n',\n",
       "  \"                                 '(' + str(idxs[0]) + ')')(*self.coords.c)\\n\",\n",
       "  '        else:\\n',\n",
       "  '            component = Function(str(self.symbol) + str(idxs))(*self.coords.c)\\n',\n",
       "  '        return component\\n'],\n",
       " 157)"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "inspect.getsourcelines(T._compute_covariant_component)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's assume that tensor __S__ is the commutator of the covariant derivatives of some arbitrary vector field __V__ and create a new _\\_compute\\_covariant\\_component_ method for the object __S__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\operatorname{V(1)}{\\left(t,r,\\theta,\\phi \\right)} & \\operatorname{V(2)}{\\left(t,r,\\theta,\\phi \\right)} & \\operatorname{V(3)}{\\left(t,r,\\theta,\\phi \\right)} & \\operatorname{V(4)}{\\left(t,r,\\theta,\\phi \\right)}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "[V(1)(t, r, \\theta, \\phi)  V(2)(t, r, \\theta, \\phi)  V(3)(t, r, \\theta, \\phi) \n",
       " V(4)(t, r, \\theta, \\phi)]"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "V = Tensor('V', 1, g)\n",
    "V(All)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "def S_new_method(idxs): # definition\n",
    "    component = (V.covariantD(idxs[0], idxs[1], idxs[2])\n",
    "                 - V.covariantD(idxs[0], idxs[2], idxs[1])).simplify()\n",
    "    S.components.update({idxs: component}) # memoization\n",
    "    return component\n",
    "S._compute_covariant_component = S_new_method\n",
    "# _compute_covariant_component method was overriden"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\frac{M \\left(2 M - r\\right) \\operatorname{V(3)}{\\left(t,r,\\theta,\\phi \\right)}}{r^{4}}$"
      ],
      "text/plain": [
       "M⋅(2⋅M - r)⋅V(3)(t, r, \\theta, \\phi)\n",
       "────────────────────────────────────\n",
       "                  4                 \n",
       "                 r                  "
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "S(1, 1, 3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "One can check that the well known formula is correct"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$ V_{\\mu ;\\nu \\rho} - V_{\\mu ;\\rho \\nu} = R^{\\sigma}_{\\ \\mu \\nu \\rho}V_{\\sigma} $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\left[\\begin{matrix}0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\end{matrix}\\right] & \\left[\\begin{matrix}0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\end{matrix}\\right] & \\left[\\begin{matrix}0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\end{matrix}\\right] & \\left[\\begin{matrix}0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\end{matrix}\\right]\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "⎡⎡0  0  0  0⎤  ⎡0  0  0  0⎤  ⎡0  0  0  0⎤  ⎡0  0  0  0⎤⎤\n",
       "⎢⎢          ⎥  ⎢          ⎥  ⎢          ⎥  ⎢          ⎥⎥\n",
       "⎢⎢0  0  0  0⎥  ⎢0  0  0  0⎥  ⎢0  0  0  0⎥  ⎢0  0  0  0⎥⎥\n",
       "⎢⎢          ⎥  ⎢          ⎥  ⎢          ⎥  ⎢          ⎥⎥\n",
       "⎢⎢0  0  0  0⎥  ⎢0  0  0  0⎥  ⎢0  0  0  0⎥  ⎢0  0  0  0⎥⎥\n",
       "⎢⎢          ⎥  ⎢          ⎥  ⎢          ⎥  ⎢          ⎥⎥\n",
       "⎣⎣0  0  0  0⎦  ⎣0  0  0  0⎦  ⎣0  0  0  0⎦  ⎣0  0  0  0⎦⎦"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "zeros = reduce(Matrix.add, [Rm(-i, All, All, All)*V(i)\n",
    "                            for i  in range(1, 5)]) - S(All, All, All)\n",
    "zeros.simplify()\n",
    "zeros"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Another way of tensor creation is to make an instance of the _Tensor_ class with components option. Tensor components stored in _Matrix_ object are  writen to the _components_ dictionary of the instance by this method. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "Z = Tensor('Z', 3, g, components=zeros, components_type=(1, 1, 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "not any(Z.components.values())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### _Tensor_ class extension"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As an example of the _Tensor_ class extension you can get the source code of any of the predefined _Tensor_ subclasses"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Christoffel', 'Ricci', 'Riemann', 'Einstein', 'Geodesic']\n"
     ]
    }
   ],
   "source": [
    "print([cls.__name__ for cls in vars()['Tensor'].__subclasses__()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(['class Christoffel(Tensor):\\n',\n",
       "  '    r\"\"\"Christoffel.\\n',\n",
       "  '\\n',\n",
       "  '    Represents a class of Christoffel symbols of the first and second kind.\\n',\n",
       "  '\\n',\n",
       "  '    Parameters\\n',\n",
       "  '    ==========\\n',\n",
       "  '\\n',\n",
       "  '    symbol : python string - name of the Christoffel symbol\\n',\n",
       "  '    metric : GraviPy MtricTensor object\\n',\n",
       "  '\\n',\n",
       "  '    Examples\\n',\n",
       "  '    ========\\n',\n",
       "  '\\n',\n",
       "  '    Define a Christoffel symbols for the Schwarzschild metric:\\n',\n",
       "  '\\n',\n",
       "  '    >>> from gravipy import *\\n',\n",
       "  \"    >>> t, r, theta, phi = symbols('t, r, \\\\\\\\theta, \\\\phi')\\n\",\n",
       "  \"    >>> chi = Coordinates('\\\\chi', [t, r, theta, phi])\\n\",\n",
       "  \"    >>> M = Symbol('M')\\n\",\n",
       "  '    >>> Metric = diag(-(1 - 2 * M / r), 1 / (1 - 2 * M / r), r ** 2,\\n',\n",
       "  '    ...                  r ** 2 * sin(theta) ** 2)\\n',\n",
       "  \"    >>> g = MetricTensor('g', chi, Metric)\\n\",\n",
       "  \"    >>> Ga = Christoffel('Ga', g)\\n\",\n",
       "  '    >>> Ga(-1, 2, 1)\\n',\n",
       "  '    -M/(r*(2*M - r))\\n',\n",
       "  '    >>> Ga(2, All, All)\\n',\n",
       "  '    Matrix([\\n',\n",
       "  '    [M/r**2,               0,  0,                 0],\\n',\n",
       "  '    [     0, -M/(2*M - r)**2,  0,                 0],\\n',\n",
       "  '    [     0,               0, -r,                 0],\\n',\n",
       "  '    [     0,               0,  0, -r*sin(\\\\theta)**2]])\\n',\n",
       "  '    >>> Ga(1, -1, 2) # doctest: +IGNORE_EXCEPTION_DETAIL\\n',\n",
       "  '    Traceback (most recent call last):\\n',\n",
       "  '    GraviPyError: \"Tensor component Ga(1, -1, 2) doesn\\'t  exist\"\\n',\n",
       "  '\\n',\n",
       "  '    \"\"\"\\n',\n",
       "  '\\n',\n",
       "  '    def __init__(self, symbol, metric, *args, **kwargs):\\n',\n",
       "  '        super(Christoffel, self).__init__(\\n',\n",
       "  '            symbol, 3, metric, index_types=(0, 1, 1), *args, **kwargs)\\n',\n",
       "  '        self.is_connection = True\\n',\n",
       "  '        self.conn = self\\n',\n",
       "  '        self.metric.conn = self\\n',\n",
       "  '\\n',\n",
       "  '    def _compute_covariant_component(self, idxs):\\n',\n",
       "  '        component = Rational(1, 2) * (\\n',\n",
       "  '            self.metric(idxs[0], idxs[1]).diff(self.coords(-idxs[2])) +\\n',\n",
       "  '            self.metric(idxs[0], idxs[2]).diff(self.coords(-idxs[1])) -\\n',\n",
       "  '            self.metric(idxs[1], idxs[2]).diff(self.coords(-idxs[0]))) \\\\\\n',\n",
       "  '            .together().simplify()\\n',\n",
       "  '        self.components.update({idxs: component})\\n',\n",
       "  '        if self.apply_tensor_symmetry:\\n',\n",
       "  '            self.components.update({(idxs[0], idxs[2], idxs[1]): component})\\n',\n",
       "  '        return component\\n'],\n",
       " 515)"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "inspect.getsourcelines(Christoffel)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
